home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
051-075
/
062
/
hackiconii_source
/
hackicon.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
12KB
|
473 lines
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* |_o_o|\\ Copyright (c) 1987 The Software Distillery. All Rights Reserved *
* |. o.| || Written by Doug Walker *
* | . | || The Software Distillery *
* | o | || 235 Trillingham Lane *
* | . |// Cary, NC 27511 *
* ====== BBS:(919)-471-6436 *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "mydebug.h"
#ifdef MYDEBUG
int debug = 0;
#endif
#include "exec/types.h"
#include "exec/memory.h"
#include "intuition/intuition.h"
#include "graphics/gfxbase.h"
#include "stdio.h"
#include "hackicon.h"
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct Menu Titles[];
extern struct Gadget colgads[];
extern struct IntuiText AboutText[];
extern char TextBuffer[];
extern struct Requester NameRequester;
extern struct Gadget Req_gads[];
extern struct Border Req_Bords[];
extern struct IntuiText Load_text, Save_text;
struct Screen *Screen;
struct Window *Window;
struct ViewPort *ViewPort;
struct iconfont *fonts[2];
int fontnum = 0;
int hires = 0;
USHORT colormap[16] = {0x0000, 0x000f, 0x00f0, 0x0f00,
0x00ff, 0x0f0f, 0x0ff0, 0x0fff,
0x0000, 0x000f, 0x00f0, 0x0f00,
0x00ff, 0x0f0f, 0x0ff0, 0x0fff
};
init()
{
struct NewScreen *NewScreen;
struct NewWindow *NewWindow;
BUG(1, ("init: enter\n"))
if(!(NewScreen = (struct NewScreen *)
AllocMem(sizeof(struct NewScreen), MEMF_CHIP | MEMF_CLEAR))
|| !(NewWindow = (struct NewWindow *)
AllocMem(sizeof(struct NewWindow), MEMF_CHIP | MEMF_CLEAR))
)
panic("Not enough memory for screens!\n");
if(! (IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", I_REV)) )
panic("Can't open intuition.library!\n");
if(! (GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library", I_REV)) )
panic("Can't open graphics.library!\n");
NewScreen->Width = SWIDTH;
NewScreen->Height = SHEIGHT;
NewScreen->Depth = SDEPTH;
NewScreen->DetailPen = 1;
NewScreen->BlockPen = 2;
NewScreen->ViewModes = HIRES;
NewScreen->Type = CUSTOMSCREEN;
NewScreen->DefaultTitle = (UBYTE *)"HackIcon II - Copyright (c) 1987 The Software Distillery";
Screen = (struct Screen *) OpenScreen(NewScreen);
BUG(9, ("init: Screen open\n"))
FreeMem(NewScreen, sizeof(struct NewScreen));
BUG(9, ("init: newscreen mem freed\n"))
NewWindow->Width = SWIDTH;
NewWindow->Height = SHEIGHT;
NewWindow->DetailPen = 1;
NewWindow->BlockPen = 2;
NewWindow->IDCMPFlags = (MOUSEBUTTONS | MENUPICK | GADGETUP);
NewWindow->Flags = (SMART_REFRESH | BACKDROP | BORDERLESS | ACTIVATE);
NewWindow->Title = NULL;
NewWindow->Screen = Screen;
NewWindow->MinWidth =
NewWindow->MaxWidth = SWIDTH;
NewWindow->MinHeight =
NewWindow->MaxHeight = SHEIGHT;
NewWindow->Type = CUSTOMSCREEN;
Window = (struct Window *)OpenWindow(NewWindow);
BUG(9, ("init: Window open\n"))
FreeMem(NewWindow, sizeof(struct NewWindow));
BUG(9, ("init: newwindow mem freed\n"))
ViewPort = (struct ViewPort *)ViewPortAddress(Window);
LoadRGB4(ViewPort, colormap, 16);
DisplayLabels();
BUG(9, ("init: setting menu labels\n"))
BUGGETC(9)
SetMenuStrip(Window, Titles);
BUG(1, ("init: exit\n"))
return(0);
}
clean(forced)
int forced;
{
int i;
BUG(1, ("clean: Enter\n"))
if(!forced)
{
for(i=0; i<MAXFONTS && fonts[i]; i++)
{
if(fonts[i]->flags & CHANGED)
{
AboutText[8].IText = fonts[i]->filename;
if(!AutoRequest(Window, &AboutText[8], &AboutText[11],
&AboutText[12], 0, 0, 430, 90))
return(1);
}
}
}
CloseWindow(Window);
CloseScreen(Screen);
CloseLibrary(GfxBase);
CloseLibrary(IntuitionBase);
for(i=0; i<MAXFONTS && fonts[i]; i++)
FreeMem(fonts[i], sizeof(struct iconfont));
BUG(1, ("clean: Exit\n"))
return(0);
}
char *GetName(load)
int load;
{
ULONG Class;
USHORT Code;
struct Gadget *Gadget;
struct IntuiMessage *imsg;
BUG(1, ("GetName: Enter\n"))
if(!load && fonts[fontnum]) strcpy(TextBuffer, fonts[fontnum]->filename);
else strcpy(TextBuffer, "Characters");
InitRequester(&NameRequester);
NameRequester.LeftEdge = 10;
NameRequester.TopEdge = 20;
NameRequester.Width = 220;
NameRequester.Height = 90;
NameRequester.ReqGadget = Req_gads;
NameRequester.ReqBorder = Req_Bords;
NameRequester.ReqText = (load ? &Load_text : &Save_text);
NameRequester.BackFill = 1;
Request(&NameRequester, Window);
while(1)
{
if(!(imsg = (struct IntuiMessage *)GetMsg(Window->UserPort)))
{
WaitPort(Window->UserPort);
continue;
}
Class = imsg->Class;
Code = imsg->Code;
Gadget = (struct Gadget *)imsg->IAddress;
ReplyMsg(imsg);
BUG(1, ("GetName: Got message, Class=%d, Code=%d\n", Class, Code))
if(Class == GADGETUP)
{
BUG(1, ("GetName: GADGETUP, GadgetID=%d\n", Gadget->GadgetID))
if(Gadget->GadgetID == G_RCANCEL)
return(NULL);
else if(Gadget->GadgetID == G_ROK)
return(TextBuffer[0] ? TextBuffer : NULL);
}
}
return(NULL);
}
WhichIcon(x, y)
short x, y;
{
int row, col;
BUG(1, ("WhichIcon: Enter, pos=(%d, %d)\n", (int)x, (int)y))
if((y-IMYTOP)%IMYSKIP<8) row = (y - IMYTOP) / IMYSKIP;
else
{
BUG(5, ("WhichIcon: bad row, returning -1\n"))
return(-1);
}
if((x-IMXLEFT)%IMXSKIP<8) col = (x - IMXLEFT) / IMXSKIP;
else
{
BUG(5, ("WhichIcon: bad col, returning -1\n"))
return(-1);
}
BUG(5, ("WhichIcon: Exit, row %d col %d returning %d", row, col, row*IMNCOLS + col))
return(row*IMNCOLS + col);
}
SetFont()
{
int start;
start = fontnum;
while(1)
{
if(++fontnum >= MAXFONTS) fontnum = 0;
if(fontnum == start)
{
DisplayBeep((struct SCREEN *)NULL);
return(1);
}
if(fonts[fontnum]) break;
};
DrawImage(Window->RPort, fonts[fontnum]->images, 0, 0);
SetWindowTitles(Window, fonts[fontnum]->filename, fonts[fontnum]->filename);
return(0);
}
AboutHackicon()
{
if(!AutoRequest(Window, AboutText, &AboutText[5], &AboutText[6], 0, 0,
410, 90))
while(!AutoRequest(Window, &AboutText[7], &AboutText[5], &AboutText[6],
0, 0, 410, 90));
return(0);
}
USHORT heximagedata[] =
{
0x6000, 0x9000, 0x9000, 0x9000, 0x6000, /* 0 */
0x4000, 0xc000, 0x4000, 0x4000, 0xe000, /* 1 */
0xe000, 0x1000, 0x6000, 0x8000, 0xf000, /* 2 */
0xe000, 0x1000, 0x6000, 0x1000, 0xe000, /* 3 */
0xa000, 0xa000, 0xf000, 0x2000, 0x2000, /* 4 */
0xf000, 0x8000, 0xe000, 0x1000, 0xe000, /* 5 */
0x6000, 0x8000, 0xe000, 0x9000, 0x6000, /* 6 */
0xf000, 0x1000, 0x2000, 0x4000, 0x4000, /* 7 */
0x6000, 0x9000, 0x6000, 0x9000, 0x6000, /* 8 */
0x6000, 0x9000, 0x7000, 0x1000, 0x6000, /* 9 */
0x6000, 0x9000, 0xf000, 0x9000, 0x9000, /* A */
0xe000, 0x9000, 0xe000, 0x9000, 0xe000, /* B */
0x7000, 0x8000, 0x8000, 0x8000, 0x7000, /* C */
0xe000, 0x9000, 0x9000, 0x9000, 0xe000, /* D */
0xf000, 0x8000, 0xe000, 0x8000, 0xf000, /* E */
0xf000, 0x8000, 0xe000, 0x8000, 0x8000 /* F */
};
DisplayLabels()
{
struct IntuiText Htext;
struct Image Himage;
int i, x, y;
char string[2];
Himage.Width = Himage.Height = 5;
Himage.Depth = 1;
Himage.PlanePick = 0x1;
Himage.PlaneOnOff = 0x0;
Himage.NextImage = NULL;
Htext.IText = string;
string[1] = '\0';
Htext.ITextFont = NULL;
Htext.FrontPen = 1;
Htext.BackPen = 0;
Htext.DrawMode = JAM1;
Htext.NextText = NULL;
for(i=0, y=IMYTOP+10; i<256 && y < SHEIGHT-IHEIGHT; y+=IMYSKIP)
{
for(x=IMXLEFT-1; x < SWIDTH-IWIDTH && i<256; x +=IMXSKIP, i++)
{
if(i<33 || i > 126)
{
Himage.LeftEdge = x; Himage.TopEdge = y;
Himage.ImageData = heximagedata+(5*((0xf0 & (UBYTE) i) >> 4));
DrawImage(Window->RPort, &Himage, 0, 0);
Himage.LeftEdge += 6; Himage.TopEdge += 3;
Himage.ImageData = heximagedata+(5*((0x0f & (UBYTE) i)));
DrawImage(Window->RPort, &Himage, 0, 0);
}
else
{
Htext.LeftEdge = x; Htext.TopEdge = y; *string = (UBYTE) i;
PrintIText(Window->RPort, &Htext, 0, 0);
}
}
}
return(0);
}
panic(string, a1)
char *string, *a1;
{
clean(1);
printf(string, a1);
exit(1);
return(0);
}
void main(argc, argv)
int argc;
char *argv[];
{
struct IntuiMessage *imsg;
int i, which;
ULONG Class;
USHORT Code;
int MouseX, MouseY;
#ifdef MYDEBUG
if(argc > 1 && argv[1][0] == '-' && argv[1][1] == 'd')
{
debug = argv[1][2] - '0';
argc--; argv++;
}
#endif
init();
for(; argc > 1; argc--, argv++)
{
switch(argv[1][0])
{
case '-':
switch(argv[1][1])
{
case 'f': /* characters filename specification */
case 'F':
argc--; argv++; /* FORCE the next parm to be name */
if(argc > 1) LoadFont(argv[1], -1);
else LoadFont("characters", -1);
break;
case 'h': /* Hi-res mode */
case 'H':
colgads[7].NextGadget = &colgads[8];
hires = 1;
break;
default:
printf("Unrecognized option '%s'\n", argv[1]);
printf("Usage: HackIcon [-f] filename [ [-f] filename] [-h]\n");
clean(1);
exit(1);
}
break;
default:
LoadFont(argv[1], -1);
break;
}
}
BUG(1, ("main: Entry"))
while(1)
{
if(!(imsg = (struct IntuiMessage *)GetMsg(Window->UserPort)))
{
WaitPort(Window->UserPort);
continue;
}
Class = imsg->Class;
Code = imsg->Code;
MouseX = imsg->MouseX;
MouseY = imsg->MouseY;
ReplyMsg(imsg);
switch(Class)
{
case MOUSEBUTTONS:
BUG(5, ("main: case MOUSEBUTTONS\n"))
if(Code == SELECTDOWN)
which = WhichIcon(MouseX, MouseY);
else if(which >= 0 && which == WhichIcon(MouseX, MouseY))
EditIcon(which);
break;
case MENUPICK:
BUG(5, ("main: case MENUPICK\n"))
if(Code == MENUNULL) break;
BUG(8, ("main: menunum = %d\n", MENUNUM(Code)))
if((i = MENUNUM(Code)) > 0)
{
AboutHackicon();
break;
}
BUG(8, ("main: itemnum = %d\n", ITEMNUM(Code)))
i = ITEMNUM(Code);
switch(i)
{
case M_LOAD:
LoadFont(GetName(1), -1);
break;
case M_SAVE:
SaveFont(NULL);
break;
case M_SAVEAS:
SaveFont(GetName(0), -1);
break;
case M_COLORS:
SetColors();
break;
case M_ALTFONT:
SetFont();
break;
case M_QUIT:
if(!clean(0)) exit(0);
break;
case M_COPY:
CopyIcon(0);
break;
case M_MCOPY:
CopyIcon(1);
break;
default:
break;
}
break;
default:
break;
}
}
exit(1);
}